﻿<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
    CodeFile="UserInput.aspx.cs" Inherits="UserInput" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <link href="../Style/LessonsStyle.css" rel="stylesheet" type="text/css" />
    Обработване на потребителски действия<br />
    Съдържание:<br />
    <ul>
        <li>Архитектура на routed events</li>
        <li>Действия с мишка</li>
        <li>Дествия с клавиатура</li>
        <li>Команди</li>
    </ul>
    <div>
        <p>
            Архитектура на routed events</p>
        <p>
            <span>В WPF голяма част от визуалните компоненти са създадени от други по-малки такаче
                закачането на евенти за всеки елемент ще е доста трудоемко и не ефикасно.Затова
                се използват routed events. WPF обхожда дървото от UI елементи и извиква всички
                хендлари на routed events които са закачени за дървото. Обхождайки от елемета към
                корена на дървото.
                <br />
                Routed events се делят на няколко вида:
                <br /></span>
                <ul>
                    <li>Bubbling - стартира се от елемемнта които се използва и започва да търси родителя.</li>
                    <li>Tunneling - оглрежда се за хендлер в корена на дървото и тръгва на доло и завършва
                        в елемента </li>
                    <li>Direct - работи като нормалните евенти в .NET </li>
                </ul>
                <p>
                    Закачане на евенти</p>
                <p>
                  <span>  Routed events се закачат като пропъртита. Всеки евент се дефинира като отделен клас
                    от където може да бъде извикан. Чрез използването на AddHandler метода и обработването
                    на RoutedEvent обекта се закачат новите евенти. Също така може да се използва помощна
                    функционалност като класа Mouse
               </span><table border=1><tbody><tr><td><div class=Code>
                
&lt;Window x:Class=&quot;RoutedEvents.RoutedEventsWindow&quot;<br />
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;<br />
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;<br />
    Title=&quot;Routed Events Demo&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;<br />
    &lt;Button PreviewMouseDown=&quot;PreviewMouseDownButton&quot;<br />
        MouseDown=&quot;MouseDownButton&quot;&gt;<br />
        &lt;Grid PreviewMouseDown=&quot;PreviewMouseDownGrid&quot;<br />
          MouseDown=&quot;MouseDownGrid&quot;&gt;<br />
            &lt;Grid.ColumnDefinitions&gt;<br />
                &lt;ColumnDefinition /&gt;<br />
                &lt;ColumnDefinition /&gt;<br />
            &lt;/Grid.ColumnDefinitions&gt;<br />
            &lt;Canvas PreviewMouseDown=&quot;PreviewMouseDownCanvas&quot;<br />
                MouseDown=&quot;MouseDownCanvas&quot;<br />
                Width=&quot;70&quot; Height=&quot;60&quot; VerticalAlignment=&quot;Center&quot;&gt;<br />
                &lt;Ellipse PreviewMouseDown=&quot;PreviewMouseDownEllipse&quot;<br />
                     MouseDown=&quot;MouseDownEllipse&quot;<br />
                     x:Name=&quot;myEllipse&quot;<br />
                     Canvas.Left=&quot;0&quot; Canvas.Top=&quot;-10&quot; Width=&quot;70&quot; Height=&quot;70&quot;<br />
                     Fill=&quot;Yellow&quot; Stroke=&quot;Black&quot; /&gt;<br />
                &lt;Ellipse Canvas.Left=&quot;15&quot; Canvas.Top=&quot;13&quot; Width=&quot;8&quot; Height=&quot;10&quot;<br />
                     Fill=&quot;Black&quot; /&gt;<br />
                &lt;Ellipse Canvas.Left=&quot;47&quot; Canvas.Top=&quot;13&quot; Width=&quot;8&quot; Height=&quot;10&quot;<br />
                     Fill=&quot;Black&quot; /&gt;<br />
                &lt;Path Data=&quot;M 5,10 A 3,3 0 0 0 13,10&quot; Stroke=&quot;Black&quot; Height=&quot;14&quot; Canvas.Left=&quot;25&quot; Canvas.Top=&quot;34&quot; Width=&quot;14&quot; Fill=&quot;Black&quot; /&gt;<br />
            &lt;/Canvas&gt;<br />
            &lt;TextBlock Grid.Column=&quot;1&quot; Margin=&quot;0,0,-36,0&quot; FontSize=&quot;23&quot;&gt;Click!&lt;/TextBlock&gt;<br />
        &lt;/Grid&gt;<br />
    &lt;/Button&gt;<br />
&lt;/Window&gt;<br />

                </div></td></tr></tbody></table> 
                C#:
                <table border=1><tbody><tr><td><div class=Code>
                <pre>
                namespace RoutedEvents
{
    /// <summary>
    /// Interaction logic for RoutedEventsWindow.xaml
    /// </summary>
    public partial class RoutedEventsWindow : Window
    {
        public RoutedEventsWindow()
        {
            InitializeComponent();
        }

        void PreviewMouseDownButton(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("PreviewMouseDownButton");
        }

        void MouseDownButton(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("MouseDownButton");
        }

        void PreviewMouseDownGrid(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("PreviewMouseDownGrid");
        }

        void MouseDownGrid(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("MouseDownGrid");
        }

        void PreviewMouseDownCanvas(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("PreviewMouseDownCanvas");
        }

        void MouseDownCanvas(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("MouseDownCanvas");
        }

        void PreviewMouseDownEllipse(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("PreviewMouseDownEllipse");
        }

        void MouseDownEllipse(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("MouseDownEllipse");
        }

    }
}
                
                </pre>

                </div></td></tr></tbody></table> </p>
           
        </p>
    </div>
    <div>
        <p>
            Действия с мишка
        </p>
        <p>
            <span>Действията на мошката могат да се насочват към всеки един елемент директно, достатъчно
                е само да се намира под курсора на мишката.<br />
                Важни евенти на мишката са:</span>
                <ul>
                    <li>Direct-mouseEnter, MouseLeave</li>
                    <li>Tunel -PreviewmouseMove, PreviewMouseLeftButtonDown,PreviewMouserightButtonDown,PreviewMouseDown</li>
                    <li>Bubble-PreviewMouseLeftButtonDown,PreviewMouseRightButtonDown,PreviewDown,PreviewMove
                    </li>
                </ul>
                <span>UIElements също дефинират двойка пропъртита</span>
                <ul>
                    <li>IsMouseOver-проверява дали мишката е върху елемента или върху някое от децата му</li>
                    <li>IsMouseDirectlyOver- проверява дали курсора на мишката в момента е върху елемента
                    </li>
                </ul>
              <span>  Евента Click е с най-висок приоритет. Примерно бътоните могат да бъдат натискани
                от мишката, стилове или от клавиатурата.<br />
                Много графични системи използват hit testing чрез които проверяват върху кои елемент
                е кликнато.</span>
                <p>
                    Състояния на мишката
                </p>
                <p>
              <span>      Класа Mouse дефинира няколко статични пропъртита и методи които се използват за
                    извличане на нинформация за мишката или за промяна на състоянието й.</span>
                    <ul>
                        <li>GetPosition - намира позицията на мишката</li>
                        <li>Capture - позволява на елемента да хване мишката и всички евенти на мишката се изпращат
                            към елемента които държи мишката</li>
                        <li>Captured - връща елемента които в момента държи мишката</li>
                        <li>OverrideCursor - дава възможност да се сложи курсора на всякъде</li>
                    </ul>
                    
                    XAML:
                      <table border=1><tbody><tr><td><div class=Code>
                &lt;Window x:Class=&quot;MouseInput.MouseInputWindow&quot;<br />
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;<br />
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;<br />
    Title=&quot;Mouse Input Demo&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;<br />
    &lt;Grid Height=&quot;258&quot; Name=&quot;grid1&quot; Width=&quot;279&quot; Background=&quot;Bisque&quot;&gt;<br />
        &lt;TextBox Height=&quot;23&quot; Margin=&quot;0,65,0,0&quot; Name=&quot;textBoxDrag&quot; VerticalAlignment=&quot;Top&quot; HorizontalAlignment=&quot;Left&quot; Width=&quot;120&quot;&gt;Or Drag This&lt;/TextBox&gt;<br />
        &lt;Label MouseDown=&quot;labelDrag_MouseDown&quot; AllowDrop=&quot;True&quot; Height=&quot;28&quot; HorizontalAlignment=&quot;Right&quot; Margin=&quot;0,44,0,0&quot; Name=&quot;labelDrag&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;120&quot;&gt;Drag this&lt;/Label&gt;<br />
        &lt;Label AllowDrop=&quot;True&quot; DragEnter=&quot;labelDrop_DragEnter&quot; Drop=&quot;labelDrop_Drop&quot; Height=&quot;28&quot; Margin=&quot;80,0,79,32&quot; Name=&quot;labelDrop&quot; VerticalAlignment=&quot;Bottom&quot;&gt;To Here&lt;/Label&gt;<br />
    &lt;/Grid&gt;<br />
&lt;/Window&gt;<br />

                </div></td></tr></tbody></table>
                    C#:
                      <table border=1><tbody><tr><td><div class=Code>
                <pre>
                namespace MouseInput
{
    /// <summary>
    /// Interaction logic for MouseInputWindow.xaml
    /// </summary>
    public partial class MouseInputWindow : Window
    {
        public MouseInputWindow()
        {
            InitializeComponent();
        }

        private void labelDrag_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Label lbl = (Label)sender;
            DragDrop.DoDragDrop(lbl, lbl.Content, DragDropEffects.Copy);
        }

        private void labelDrop_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
                e.Effects = DragDropEffects.Copy;
            else
                e.Effects = DragDropEffects.None;
        }

        private void labelDrop_Drop(object sender, DragEventArgs e)
        {
            ((Label)sender).Content = e.Data.GetData(DataFormats.Text);
        }
    }
}
                </pre>
                </div></td></tr></tbody></table>
                    
                </p>
            
        </p>
    </div>
    <div>
        <p>
            Дествия с клавиатура
        </p>
        <p>
            <span>Във всеки един момент всеки един елемент разполага с focus. Фокуса се приема чрес
                клик върху някои от контролите или използването на бутон от клавиатурата като напрвимер
                Tab.
                <ul>
                    <li>Tunneling - PreviewKeyDown, PreviewTextinput, PreviewKeyUp</li>
                    <li>Bubbling - KeyDown, Testinput,KeyUp </li>
                </ul>
                Също като класа Mouse така и Keyboard предоставя няколко основни пропъртита.
                <ul>
                    <li>Modifirs - засича кой от спациалните клавиши е натиснат Alt, Shift или Ctrl
                  
                    
                    </li>
                    <li>IsKeyDown и IsKeyUp - засича дали бутона е натиснат надоло или вече е освободен
                    </li>
                    <li>Focusedelement - засича кои елемент има фокус от клавиатурата</li>
                </ul>
            </span>
        </p>
    </div>
    <div>
        <p>
            Команди
        </p>
        <p>
            <span>Чрез командите приложението изпълнява потребителските рекуести. Пример за подобни
                действия са Ctrl+C тази команда избира Edit->copy елелемента. Отговора на проложението
                трябва да е едно и също във всички случаи. Командните системи задават на UI elementite
                да оредиставят единичен хендлер за всяка команда. По тоази начин се увеличава чистотата
                на кода и се намаля разхвърляността на кода.<br />
                В WPF се предоставят стандартни класове с които се дефинират командите като:
                <ul>
                    <li>ApplicationCommands</li>
                    <li>ComponentsCommands</li>
                    <li>EditingCommands</li><li>MediaCommands</li><li>NavigationCommands</li>
                </ul>
            </span>
       
       
              <table border=1><tbody><tr><td><div class=Code>
                &lt;Window x:Class=&quot;Commands.CommandsWindow&quot;<br />
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;<br />
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;<br />
    Title=&quot;Commands Demo&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;<br />
    &lt;DockPanel&gt;<br />
        &lt;Menu DockPanel.Dock=&quot;Top&quot;&gt;<br />
            &lt;MenuItem Header=&quot;_Edit&quot;&gt;<br />
                &lt;MenuItem Header=&quot;Cu_t&quot; Command=&quot;ApplicationCommands.Cut&quot; /&gt;<br />
                &lt;MenuItem Header=&quot;_Copy&quot; Command=&quot;ApplicationCommands.Copy&quot; /&gt;<br />
                &lt;MenuItem Header=&quot;_Paste&quot; Command=&quot;ApplicationCommands.Paste&quot; /&gt;<br />
            &lt;/MenuItem&gt;<br />
        &lt;/Menu&gt;<br />
        &lt;ToolBarTray DockPanel.Dock=&quot;Top&quot;&gt;<br />
            &lt;ToolBar&gt;<br />
                &lt;Button Command=&quot;Cut&quot; Content=&quot;Cut&quot; /&gt;<br />
                &lt;Button Command=&quot;Copy&quot; Content=&quot;Copy&quot; /&gt;<br />
                &lt;Button Command=&quot;Paste&quot; Content=&quot;Paste&quot; /&gt;<br />
            &lt;/ToolBar&gt;<br />
        &lt;/ToolBarTray&gt;<br />
        &lt;TextBox /&gt;<br />
    &lt;/DockPanel&gt;<br />
&lt;/Window&gt;<br />

                </div></td></tr></tbody></table>
       
       
        </p>
    </div>
</asp:Content>
